using System;
using UnityEngine;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;

namespace Cysharp.Threading.Tasks.Sample {
    //[AddComponentMenu("[Tool-Kid] Stopwatch 码表")]    
    public class Stopwatch : MonoBehaviour {
        [SerializeField] private Text timerText; // 显示计时器时间的UI Text
        [SerializeField] private float duration = 60f; // 计时器时间
        [SerializeField] private bool isCountdown = true; // 是否为倒计时
        [SerializeField] private bool hasEndTime = true; // 是否有结束时间
        [SerializeField] private bool destroyOnComplete = true; // 计时完成后是否自行销毁
        private Timer timer;

        private void Start() {
            // 设定计时器时间
            SetTimer(duration, hasEndTime);
            if (!timerText) return;
        }

        // 设定计时器时间
        public void SetTimer(float duration, bool isCountdown = true) {
            if (isCountdown) {
                timer = new Timer(duration);
            }
            else {
                timer = new Timer(float.PositiveInfinity);
            }
            UpdateTimeUI();
            // 设定 Tick 事件
            timer.OnTimerTick += () => {
                // 更新显示时间
                UpdateTimeUI();
                return UniTask.CompletedTask;
            };

            // 设定 Complete 事件
            timer.OnTimerComplete += () => {
                // 更新显示时间
                UpdateTimeUI();
                if (destroyOnComplete) {
                    Destroy(gameObject);
                }

                return UniTask.CompletedTask;
            };
        }

        // 更新显示时间
        private void UpdateTimeUI() {
            if (timerText == null) return;

            // 获取计时器时间
            float time = timer.IsRunning ? timer.CurrentTime : timer.Duration;
            // 决定是否显示为倒数的时间
            time = isCountdown ? timer.Duration - timer.CurrentTime : time;

            // 转换为时间格式
            TimeSpan timeSpan = TimeSpan.FromSeconds(time);

            // 更新 UI 文字            
            timerText.text = string.Format("{0:D2}:{1:D2}:{2:D2}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
        }

        // 开始计时器
        public void StartTimer() {
            if (timer == null) return;
            timer.Start();
        }

        // 停止计时器
        public void StopTimer() {
            if (timer == null) return;
            timer.Stop();
        }

        // 销毁物件时，停止计时器
        private void OnDestroy() {
            StopTimer();
        }
    }
}